/*
    作者：zx
    时间：2023.1.31
    描述：键盘相关
*/

#ifndef KBD_H
#define KBD_H

#include "cpu/irq.h"

#define KBD_PORT_DATA   0x60
#define KBD_PORT_SATA   0x64
#define KBD_PORT_CMD    0x64
// 左右shift
#define KEY_RSHIFT 0x36
#define KEY_LSHIFT 0x2A
// 大小写键
#define KEY_CAPS 0x3A
#define KEY_CTRL 0x1D
#define KEY_ALT 0x38

// 键盘输入码的开头
#define KEY_E0 0xE0
#define KEY_E1 0xE1

#define KEY_F1 0x3B
#define KEY_F2 0x3C
#define KEY_F3 0x3D
#define KEY_F4 0x3E
#define KEY_F5 0x3F
#define KEY_F6 0x40
#define KEY_F7 0x41
#define KEY_F8 0x42
#define KEY_F9 0x43
#define KEY_F10 0x44
#define KEY_F11 0x57
#define KEY_F12 0x58

// 键盘状态第0位 代表是否有数据从键盘输入
#define KBD_status_RECV_READY (1 << 0)

// 每一个键对应的两个字符
typedef struct _key_map_t
{
    // 正常字符
    uint8_t normal;
    // shift按下时的字符
    uint8_t func;
}key_map_t;

// 键盘状态记录
typedef struct _kbd_status_t
{
    // 大小写锁定
    int caps : 1;
    // 左右shift是否按下
    int lshift_press : 1;
    int rshift_press : 1;
    int lalt_press : 1;
    int ralt_press : 1;

    int lctrl_press : 1;
    int rctrl_press : 1;
}kbd_status_t;


void kbd_init(void);
void exception_handler_kbd(void);
void do_handler_kbd(exception_frame_t *);

#endif // !KBD_H